win32-theme: Support -gtk-win32-size CSS value
authorAlexander Larsson <alexl@redhat.com>
Wed, 16 Nov 2011 11:19:20 +0000 (12:19 +0100)
committerAlexander Larsson <alexl@redhat.com>
Thu, 17 Nov 2011 11:30:08 +0000 (12:30 +0100)
gtk/gtkstyleproperty.c
gtk/gtkwin32theme.c
gtk/gtkwin32themeprivate.h

index 7c302ada744b754fcea11fefe2003e5246445088..f511c717a4e07c03bd86730c15f89f46c672c1c5 100644 (file)
@@ -385,6 +385,17 @@ int_value_parse (GtkCssParser *parser,
 {
   gint i;
 
+  if (_gtk_css_parser_begins_with (parser, '-'))
+    {
+      int res = _gtk_win32_theme_int_parse (parser, base, &i);
+      if (res >= 0)
+       {
+         g_value_set_int (value, i);
+         return res > 0;
+       }
+      /* < 0 => continue */
+    }
+
   if (!_gtk_css_parser_try_int (parser, &i))
     {
       _gtk_css_parser_error (parser, "Expected a valid integer value");
@@ -589,11 +600,26 @@ border_value_parse (GtkCssParser *parser,
 
   for (i = 0; i < G_N_ELEMENTS (numbers); i++)
     {
-      if (!_gtk_css_parser_try_uint (parser, &numbers[i]))
-        break;
+      if (_gtk_css_parser_begins_with (parser, '-'))
+       {
+         /* These are strictly speaking signed, but we want to be able to use them
+            for unsigned types too, as the actual ranges of values make this safe */
+         int res = _gtk_win32_theme_int_parse (parser, base, (int *)&numbers[i]);
+
+         if (res == 0) /* Parse error, report */
+           return FALSE;
+
+         if (res < 0) /* Nothing known to expand */
+           break;
+       }
+      else
+       {
+         if (!_gtk_css_parser_try_uint (parser, &numbers[i]))
+           break;
 
-      /* XXX: shouldn't allow spaces here? */
-      _gtk_css_parser_try (parser, "px", TRUE);
+         /* XXX: shouldn't allow spaces here? */
+         _gtk_css_parser_try (parser, "px", TRUE);
+       }
     }
 
   if (i == 0)
index 71f7ad2321378cc5cc77f5da8dd02a64421340cf..78ac8963139f5b9f11280a503a878190f95ef757 100644 (file)
@@ -365,3 +365,74 @@ _gtk_win32_theme_part_render  (GtkWin32ThemePart  *part,
   return cairo_pattern_create_rgb (color.red, color.green, color.blue);
 #endif
 }
+
+int
+_gtk_win32_theme_int_parse (GtkCssParser      *parser,
+                           GFile             *base,
+                           int               *value)
+{
+  char *class;
+  int arg;
+
+  if (_gtk_css_parser_try (parser,
+                          "-gtk-win32-size",
+                          TRUE))
+    {
+      if (!_gtk_css_parser_try (parser, "(", TRUE))
+       {
+         _gtk_css_parser_error (parser,
+                                "Expected '(' after '-gtk-win32-size'");
+         return 0;
+       }
+
+      class = _gtk_css_parser_try_name (parser, TRUE);
+      if (class == NULL)
+       {
+         _gtk_css_parser_error (parser,
+                                "Expected name as first argument to  '-gtk-win32-size'");
+         return 0;
+       }
+
+      if (! _gtk_css_parser_try (parser, ",", TRUE))
+       {
+         g_free (class);
+         _gtk_css_parser_error (parser,
+                                "Expected ','");
+         return 0;
+       }
+
+      if (!_gtk_css_parser_try_int (parser, &arg))
+       {
+         g_free (class);
+         _gtk_css_parser_error (parser, "Expected a valid integer value");
+         return 0;
+       }
+
+      if (!_gtk_css_parser_try (parser, ")", TRUE))
+       {
+         _gtk_css_parser_error (parser,
+                                "Expected ')'");
+         return 0;
+       }
+
+#ifdef G_OS_WIN32
+      if (use_xp_theme && get_theme_sys_metric != NULL)
+       {
+         HTHEME theme = lookup_htheme_by_classname (class);
+
+         /* If theme is NULL it will just return the GetSystemMetrics value */
+         *value = get_theme_sys_metric (theme, arg);
+       }
+      else
+       *value = GetSystemMetrics (arg);
+#else
+      *value = 1;
+#endif
+
+      g_free (class);
+
+      return 1;
+    }
+
+  return -1;
+}
index adad562254250e272c5a2814038c7b0592526e0e..b066d9ab14d480045f4034a3d47b477e7fd3d193 100644 (file)
@@ -42,6 +42,9 @@ int                _gtk_win32_theme_part_parse     (GtkCssParser      *parser,
 cairo_pattern_t   *_gtk_win32_theme_part_render   (GtkWin32ThemePart  *part,
                                                   int                 width,
                                                   int                 height);
+int                _gtk_win32_theme_int_parse     (GtkCssParser      *parser,
+                                                  GFile             *base,
+                                                  int               *value);
 
 G_END_DECLS